/*
 * Copyright 2023-2085 xujin <ceo@itgrail.com>
 *
 * Licensed under the Grail License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://itgrail.com/docs?id=3&catalogId=87
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.itgrail.pilot.domain.user.service.impl;

import com.itgrail.pilot.domain.user.entity.RoleE;
import com.itgrail.pilot.domain.user.entity.UserRolesE;
import com.itgrail.pilot.domain.user.factory.RoleFactory;
import com.itgrail.pilot.domain.user.ports.RolePermissionPort;
import com.itgrail.pilot.domain.user.ports.RolePort;
import com.itgrail.pilot.domain.user.ports.UserRolePort;
import com.itgrail.pilot.domain.user.repository.RolePermissionRepository;
import com.itgrail.pilot.domain.user.repository.RoleRepository;
import com.itgrail.pilot.domain.user.repository.UserRolesRepository;
import com.itgrail.pilot.domain.user.service.RoleService;
import com.itgrail.pilot.domain.user.valueobject.RolePermissionVO;
import org.springframework.beans.factory.annotation.Autowired;
import com.itgrail.grail.ddd.annotation.domain.DomainService;
import com.itgrail.grail.exception.BusinessException;

import javax.annotation.Resource;
import java.util.List;

/**
 * 角色相关域服务
 */
@DomainService
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private RolePort rolePort;

    @Autowired
    private RolePermissionRepository rolePermissionRepository;

    @Autowired
    private RoleFactory roleFactory;

    @Autowired
    private UserRolesRepository userRolesRepository;

    @Resource
    private RolePermissionPort rolePermissionPort;

    @Resource
    private UserRolePort userRolePort;


    @Override
    public void saveOrUpdateRole(RoleE roleE, List<Long> pIdList) {
        roleE.setRoleRepository(roleRepository);
        rolePort.save(roleE);
        for (Long id : pIdList) {
            RolePermissionVO rolePermissionVO = roleFactory.createRolePerVO(roleE.getKey(), id);
            rolePermissionPort.deleteByKeyAndPid(rolePermissionVO);
            rolePermissionPort.save(rolePermissionVO);
        }

    }

    @Override
    public void deleteRole(Long id) {
        RoleE roleE = roleFactory.getRole(id);
        List<UserRolesE> userRolesDOList = userRolePort.queryByRole(roleE.getKey());
        if (null != userRolesDOList && userRolesDOList.size() > 0) {
            throw new BusinessException("400", "删除的角色目前正在使用,不允许删除");
        }
        roleE.setRoleRepository(roleRepository);
        rolePermissionPort.deleteByKey(roleE.getKey());
        rolePort.delete(roleE);
    }

}
